import json





def transform_jsonl(input_path, output_path):
    """
    读取一个JSONL文件，将其转换为指令微调格式，并写入新的JSONL文件。
    该函数会移除每个实体中的 'start_offset' 和 'end_offset' 字段。
    """
    # 定义统一的指令模板
    INSTRUCTION = "你是一个医疗命名实体识别的专家。请从以下文本中抽取出 'dis'（疾病）和 'pro'（医疗程序）类型的实体，并以JSON格式返回。"

    try:
        # 使用 'with' 语句安全地打开输入和输出文件
        with open(input_path, 'r', encoding='utf-8') as infile, \
                open(output_path, 'w', encoding='utf-8') as outfile:

            lines_processed = 0
            # 逐行读取输入文件
            for line in infile:
                # 跳过空行
                if not line.strip():
                    continue

                # 1. 解析原始JSON行
                original_data = json.loads(line)

                # 2. 提取文本作为 "input"
                input_text = original_data.get('text', '')

                # 3. 提取并处理实体列表，移除 offset 字段
                original_entities = original_data.get('entities', [])

                # 使用列表推导式高效地完成转换
                cleaned_entities = [
                    {"entity": entity.get("entity"), "label": entity.get("label")}
                    for entity in original_entities
                ]

                # 4. 构建新的数据结构
                new_data_point = {
                    "instruction": INSTRUCTION,
                    "input": input_text,
                    # 将处理后的实体列表转换为JSON字符串作为 "output"
                    "output": json.dumps(cleaned_entities, ensure_ascii=False)
                }

                # 5. 将新的JSON对象写入输出文件，并添加换行符
                outfile.write(json.dumps(new_data_point, ensure_ascii=False) + '\n')
                lines_processed += 1

        print(f"数据转换成功！共处理 {lines_processed} 行。")
        print(f"   - 输入文件: {input_path}")
        print(f"   - 输出文件: {output_path}")

    except FileNotFoundError:
        print(f" 错误: 输入文件 '{input_path}' 未找到。请确保文件名正确且文件与脚本在同一目录下。")
    except json.JSONDecodeError as e:
        print(f"错误: 解析JSON时出错。请检查文件 '{input_path}' 的格式。错误信息: {e}")
    except Exception as e:
        print(f" 发生未知错误: {e}")

if __name__ == '__main__':
    INPUT_FILENAME = r"D:\py_code\code_models\train_class\data\train.json"
    OUTPUT_FILENAME = r"trian_data/training_data.jsonl"
    transform_jsonl(INPUT_FILENAME, OUTPUT_FILENAME)
